package CI.aufgabe2.cip.mynodes;

import java.util.List;
import java.util.ListIterator;

import CI.aufgabe2.cip.SymbolTable;
import CI.aufgabe2.cip.base.AbstractDescr;

public class MyActualParametersNode extends MyAbstractNode {

	private static final long serialVersionUID = 1L;

	private final List<MyAbstractNode> expressionList;

	public MyActualParametersNode(List<MyAbstractNode> expressionList) {
		this.expressionList = expressionList;
	}

	@Override
	public void print() {
		trace("ActualParametersNode ");
		for (MyAbstractNode expression : expressionList) {
			expression.print();
		}
		unindent();

	}

	public List<MyAbstractNode> getExpressionList(){
		return this.expressionList;
	}
	public AbstractDescr compile(SymbolTable sym) {
//		write("INIT, " + expressionList.size());

		// schreibe ergebnisse der Expressions auf den Stack
		ListIterator<MyAbstractNode> it = expressionList
				.listIterator(expressionList.size());
		while (it.hasPrevious()) {
			MyAbstractNode actual = it.previous();

			// wert der aktuellen expression berechnen
			actual.compile(sym);
			if(actual instanceof MyIdNode && !((MyIdNode) actual).getVar())
				write("CONT, 1");
			//TODO:
//			HIER IST NOCH WAS ZU TUN -> TEST RECUSIVE PROCEDURES -> 
//			CONT WIRD BENOETIGT UM DIE ADRESSE ZU UEBERGEBEN, SONST 
//			FUNKTIONIERT DAS!!!! FEHLER FINDEN!!!!
//			if(actual instanceof MyIdNode && sym.currentLvl()>0 && ((MyIdNode) actual).getVar())
//				write("CONT, 1");
			// berechneten Wert auf Stack
			write("GETSP");
			write("ASSIGN, 1");

			// Stackpointer aktualisieren
			write("GETSP");
			write("PUSHI, 1");
			write("ADD");
			write("SETSP");
		}
		return null;
	}

}
